package FileIO.OutputStream;

import java.io.*;
import java.util.Arrays;

/**
 * @Author: ylc
 * @Description:字节输出流-向文件写入数据的方法
 * @Date Created in 2022-04-25 16:14
 */
public class OutputDemo1 {
    /*
        java.io.OutputStream:字节输出流
            此抽象类是表示输出字节流的所有类的超类。
        构造方法：
            FileOutputStream(String name)创建一个向具有指定名称的文件中写入数据的输出文件流。
            FileOutputStream(File file) 创建一个向指定 File 对象表示的文件中写入数据的文件输出流。

        - public abstract void write(int b) ：将指定的字节输出流。
        - public void write(byte[] b)：将 b.length字节从指定的字节数组写入此输出流。
          一次写多个字节:
                如果写的第一个字节是正数(0-127),那么显示的时候会查询ASCII表
                如果写的第一个字节是负数,那第一个字节会和第二个字节,两个字节组成一个中文显示,查询系统默认码表(GBK)
        - public void write(byte[] b, int off, int len) ：从指定的字节数组写入 len字节，从偏移量 off开始输出到此输出流。

        - public void close() ：关闭此输出流并释放与此流相关联的任何系统资源。
        - public void flush() ：刷新此输出流并强制任何缓冲的输出字节被写出。
         重要：我们知道 I/O 的速度是很慢的，所以，大多的 OutputStream 为了减少设备操作的次数，
              在写数据的时候都会将数据先暂时写入内存的 一个指定区域里，入设备中，这个区域一般称为缓冲区。
              但造成一个结果，就是我们写的数据，很可能会遗留一部分在缓冲区中。
              需要在最后或者合适的位置，调用 flush（刷新）操作，将数据刷到设备中。
 */
    public static void main(String[] args) throws IOException {
        FileOutputStream fos = new FileOutputStream("Study04\\a.txt");
        fos.write(97);

        byte[] bytes = {65,66,67,68,69};//ABCDE
        //byte[] bytes = {-65,-66,-67,68,69};//烤紻E
        fos.write(bytes);
        fos.write(bytes,1,2);//BC

        /*
             byte[] getBytes()  把字符串转换为字节数组
        */
        byte[] bytes2 = "叶良承".getBytes();
        System.out.println(Arrays.toString(bytes2));//[-28, -67, -96, -27, -91, -67]
        fos.write(bytes2);

        //释放资源
        fos.flush();
    }
}
